/***********************************************************************************************//**
*\n  @file       device_uart.hpp
*\n  @brief      RS232/RS485设备类
*\n  @details
*\n -----------------------------------------------------------------------------------
*\n  文件说明：
*\n       1. RS232/RS485设备类
*\n
*\n -----------------------------------------------------------------------------------
*\n  版本:   修改人:       修改日期:        描述:
*\n  V0.01   罗先能        2021.5.12          创建
*\n
***************************************************************************************************/
#pragma once
#ifndef H_846F3F55_754E_4C6E_943F_1F8F866040F4_
#define H_846F3F55_754E_4C6E_943F_1F8F866040F4_

/**************************************************************************************************
* 头文件
***************************************************************************************************/
#include "device.hpp"

/**************************************************************************************************
* 宏定义、结构定义
***************************************************************************************************/
#ifdef  __cplusplus //-- C only -----------------------------------------------------------
extern "C" {
#endif

typedef struct TRs232Handle
{
	// (已经支持):
	int iBandrate;  	// 波特率(单位 bps)
	int iStopBit;   	// 停止位 1==1bit, 2==2bit(or 1.5bit)

	// (不支持如下控制)
	int iParity;    	// 奇偶校验位 0==none, 1==odd奇校验,2==even偶校验,
	int iFlowControl; 	// 流控 0==none, 1==Xon/Xoff, 2==RTS/CTS,
	int iDataBits;  	// 数据位byte长 0==8bit,1==7bit,2==6bit,3==5bit;

} TRs232Handle;


#ifdef  __cplusplus //--C end -------------------------------------------------------------
}
#endif

/**************************************************************************************************
* 全局变量声明、定义
***************************************************************************************************/


/**************************************************************************************************
* 私有变量声明、定义
***************************************************************************************************/


/**************************************************************************************************
* 私有函数声明、定义
***************************************************************************************************/


/**************************************************************************************************
* 全局函数声明、定义
***************************************************************************************************/

#ifdef  __cplusplus //-- C++ only ---------------------------------------------------------

/*************************************************************************************//**
*\n 类名称： TRs232FromSpi()
*\n 功能描述：
*\n      1. spi2rs232类,通过外接spi接口的RS232芯片(sc16is752)操作
*\n
*\n -----------------------------------------------------------------------------------
*\n  版本:   修改人:       修改日期:        描述:
*\n  V0.01   罗先能        2021.5.12       创建
*****************************************************************************************/
class TRs232FromSpi : public TDevice
{
// -- 增加 ----
private:
	// 静态函数/静态数据
	static int iReference;
	static TRs232FromSpi *tSelf[2];
	///< GPIO静态参数定义
	static int		gpioFd; 					///< gpio Fd
	static TDevice* pIfGpio;					///< 指向gpio实例
	static TBus*	pIfSpi; 					///< 指向spi实例

private:
	static pthread_t iTid;						///< 中断线程tid
	static void* GpioInterruptTask(void *arg);	///< gpio中断线程

private:
	// gpio中断线程中使用
	void   IrqRead(int channel);                ///< 接收函数(中断中使用)
	char   mRxIrqBuffer[128];                   ///< 接收buffer
	long   mRxSize;                             ///< 接收到的长度
	sem_t  sem;


public:
	TRs232FromSpi(const char *name, TDevice *pGpio, TBus *pSpi,
				  u32 index /* 0: spi2uart0, 1: spi2uart1 */ );
	virtual ~TRs232FromSpi();


// -- 继承于基类 ----
protected:
	// char Name[32];   		// 实例名称
	// TBus *pBus;	  			// bus总线
	// pthread_rwlock_t mLock;  // 锁

public:
	// virtual int Init() 												override;
	virtual int Open(void *pHandle) 								override;
	virtual int Close(void *pHandle) 								override;
	// virtual int Lock() 												override;
	// virtual int Unlock() 											override;
	virtual int Read(long address, void *pBuf, long iSizeToRead) 	override;
	virtual int Write(long address, void *pBuf, long iSizeToWrite)	override;
	// virtual int Ioctl(long cmd, void *pBuf, long *pSize) 			override;
};
#endif //-- C++ end -------------------------------------------------------------------

#endif // H_846F3F55_754E_4C6E_943F_1F8F866040F4_

